package com.water_work_form.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.water_work_form.entity.RecordStorageDrugTest;
import com.water_work_form.entity.dto.DrugTestDTO;
import com.water_work_form.mapper.*;
import com.water_work_form.mapper.dto.DrugTestMapper;
import com.water_work_form.service.RecordStorageDrugTestService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 * 记录——储药池药剂检测记录 服务实现类
 * </p>
 *
 * @author xuke
 * @since 2023-08-17
 */
@Service
public class RecordStorageDrugTestServiceImpl extends ServiceImpl<RecordStorageDrugTestMapper, RecordStorageDrugTest> implements RecordStorageDrugTestService {

    @Autowired
    RecordStorageDrugTestMapper recordStorageDrugTestMapper;

    @Autowired
    BasicFormMapper basicFormMapper;

    @Autowired
    BasicFormulaMapper basicFormulaMapper;

    @Autowired
    BasicMedicalMapper basicMedicalMapper;

    @Autowired
    BasicRestrictionMapper basicRestrictionMapper;

    @Autowired
    DrugTestMapper drugTestMapper;

    @Value("${file.templateFilePath}")
    private String templateFilePath;

    @Value("${file.destFilePath}")
    private String destFilePath;

    /**
     * 记录——储药池药剂检测记录 项目查询（三个查询项+分页+排序）
     * @param type 项目类型（type） 若为空则不进行此项查询，否则返回对应type的数据（因为前端页面设计，type基本上不会为空，且有默认值“硫酸铵”）
     * @param current 分页查询 当前页数
     * @param status 项目状态（status） 若为空则不进行此项查询，否则返回对应status的数据
     * @param startSampleDate 取样日期（sample_date）范围查询的开始日期 若为空则不进行此项查询，否则返回sample_date大于startSampleDate的数据
     * @param endSampleDate 取样日期（sample_date） 范围查询的结束日期 若为空则不进行此项查询，否则返回sample_date小于endSampleDate的数据
     * @param size 分页查询 一页展示数据最大量
     * @return 将符合上述查询条件的数据按照 状态（status）、取样日期（sample_date）、取样时间（sample_time）、检测时间（check_time）的前后顺序作为优先级（即状态status优先级最高）进行升序排序（为空则置顶）
     */
    @Override
    public IPage<RecordStorageDrugTest> selectRecordStorageDrugTest(String type, Integer current, String status,
                                                                    String startSampleDate, String endSampleDate, Integer size){
        QueryWrapper<RecordStorageDrugTest> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("type",type);
        if(!status.isEmpty()){
            queryWrapper.eq("status",status);
        }
        if(!startSampleDate.isEmpty() && !endSampleDate.isEmpty()){
            queryWrapper.ge("sample_date",startSampleDate).le("sample_date",endSampleDate);
        }
        queryWrapper.orderByAsc("status", "sample_date","sample_time","check_time");
        IPage<RecordStorageDrugTest> page = new Page<>(current,size);
        return this.page(page,queryWrapper);
    }

    /**
     * 记录——储药池药剂检测记录 基础表数据查询
     * @param type 项目类型 对基础表formula、medical、restriction查询对应项
     * @param name 表名 对基础表form进行对应项查询
     * @return 返回所有查询到的数据，并以基础表名作为键
     */
    @Override
    public Map<String,Object> selectBasicStorageDrugTest(String type, String name) {
//        此表和drugTest那张表基础内容一致，controller层暂调用drugTest表的该方法
        Map<String,Object> map = new HashMap<>();
        map.put("form", basicFormMapper.getOneByName(name));
//        QueryWrapper<DrugTestDTO> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("a.name",type).select("a.name", "a.formula_content", "a.formula_description", "b.standard_name", "b.concentration",
//                "b.certificate_no", "b.effective_date", "c.standard_basis");
//        map.put("basic", drugTestMapper.selectOne(queryWrapper));
        map.put("formula", basicFormulaMapper.getOneByName(type));
        map.put("medical", basicMedicalMapper.getOneByName(type));
        map.put("restriction", basicRestrictionMapper.getOneByName(type));
        return map;
    }

    /**
     * 记录——储药池药剂检测记录 列表数据导出
     * @param recordStorageDrugTestList 需要导出的数据列表
     * @throws IOException 异常
     */
    @Override
    public void downloadRecordStorageDrugTest(List<RecordStorageDrugTest> recordStorageDrugTestList, String restrictionString, String formulaContentString, String formulaDescriptionString,
                                              String medicalString) throws IOException {
        Map<String, Object> data = new HashMap<String, Object>();
        List<String> formatSampleDate  = new ArrayList<>();
        List<String> formatCheckTime  = new ArrayList<>();
        List<Map<String,Object>> formatList = new ArrayList<Map<String,Object>>();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        // 使用map方法获取对象的时间字段，并格式化
        formatSampleDate  = recordStorageDrugTestList.stream()
                .map(recordStorageDrugTest -> dateFormat.format(recordStorageDrugTest.getSampleDate()))
                .collect(Collectors.toList());
        formatCheckTime  = recordStorageDrugTestList.stream()
                .map(recordStorageDrugTest -> datetimeFormat.format(recordStorageDrugTest.getCheckTime()))
                .collect(Collectors.toList());
        for (int i = 0;i < recordStorageDrugTestList.size();i++){
            Map<String,Object> map = new HashMap<>();
            map.put("list",recordStorageDrugTestList.get(i));
            map.put("sampleDate",formatSampleDate.get(i));
            map.put("checkTime",formatCheckTime.get(i));
            formatList.add(map);
        }
        List<String> descriptionList= Arrays.asList(formulaDescriptionString.split("；"));
        List<Map<String,Object>> formulaDescriptionList = new ArrayList<Map<String,Object>>();
        for (int i = 0;i < descriptionList.size();i++){
            Map<String,Object> map = new HashMap<>();
            map.put("index",i);
            map.put("formulaDescription",descriptionList.get(i));
            formulaDescriptionList.add(map);
        }
        JSONObject restriction =  JSON.parseObject(restrictionString);
        JSONObject formulaContent =  JSON.parseObject(formulaContentString);
        JSONObject medical =  JSON.parseObject(medicalString);
        String img = "http://localhost:88/file/" + formulaContent.get("url");
        data.put("lists",formatList);
        data.put("restriction",restriction);
        data.put("formulaContent", Pictures.ofUrl(img)
                .size(200, 50).create());
        data.put("formulaDescriptionList",formulaDescriptionList);
        data.put("medical",medical);
        System.out.println(data.get("formulaContent"));
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        Configure config = Configure.builder()
                .bind("formulaDescriptionList", policy)
                .bind("lists", policy).build();
        XWPFTemplate compile = XWPFTemplate.compile(templateFilePath + "RecordStorageDrugTest.docx",config);
        compile.render(data);
        compile.writeToFile(destFilePath + "out_recordStorageDrugTest.docx");
        compile.close();
    }



}
